package com.ywk.base.common.util;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import org.springframework.util.StringUtils;

import java.util.*;

/**
 * 一个关于JSON的简单转换工具类；<br>
 * 如果有更加复杂的转换，可以通过getGson()获取gson对象，然后再自行转换，方法为：gson.fromJson(json, new TypeToken<T>() {}.getType())
 * @author binzec
 */
public class JsonUtil {

	private static Gson gson = new Gson();
	
	/**
	 * 获取gson对象，可以自己做一些比较复杂的转换
	 */
	public static Gson getGson() {
		return gson;
	}
	
	/**
	 * 把一个对象（包括javaBean、Map、List等）转成json字符串
	 */
	public static String toJson(Object obj) {
		return gson.toJson(obj);
	}
	
	/**
	 * 将json字符串转成javaBean
	 * @param json	json字符串
	 * @param clazz	bean类型
	 */
	public static <T> T jsonToBean(String json, Class<T> clazz) {
		if (!StringUtils.isEmpty(json)) {
			return gson.fromJson(json, clazz);
		} else {
			return null;
		}
	}
	
	/**
	 * 将json字符串转成List
	 * @param json	json字符串
	 * @param clazz	List中的泛型
	 */
	public static <T> List<T> jsonToList(String json, Class<T> clazz) {
		List<T> list = new ArrayList<T>();
		if (!StringUtils.isEmpty(json)) {
			JsonArray array = new JsonParser().parse(json).getAsJsonArray();
			for (JsonElement elem : array) {
				list.add(gson.fromJson(elem, clazz));
			}
		}
		return list;
	}
	
	/**
	 * 将json字符串转成Map<String, ?>
	 * @param json	json字符串
	 * @param clazz	Map中value的泛型
	 */
	public static <T> Map<String, T> jsonToMap(String json, Class<T> clazz) {
		Map<String, T> map = null;
		if (!StringUtils.isEmpty(json)) {
			map = gson.fromJson(json, new TypeToken<Map<String, T>>() {}.getType());
		}
		return map;
	}

	public static void main(String[] args) {
		User user = new User("sdf", 3, "男");
		List<User> userList=new ArrayList<>();
		userList.add(user);
		userList.add(new User("gds", 3, "女"));
		Map<String, Object> map = new HashMap<>();
		map.put("name","fse");
		map.put("age","1");
		map.put("sex","男");

		System.out.println("==============Gson : Bean to Json===============");
		String beanToJson = JsonUtil.toJson(user);
		System.out.println(beanToJson);

		System.out.println("==============Gson : List to Json===============");
		String listToJson = JsonUtil.toJson(userList);
		System.out.println(listToJson);

		System.out.println("==============Gson : Map to Json===============");
		String mapToJson = JsonUtil.toJson(map);
		System.out.println(mapToJson);

		System.out.println("====================================================================================");

		System.out.println("==============Gson : Json to Bean===============");
		User fromUser = JsonUtil.jsonToBean(beanToJson, User.class);
		System.out.println(fromUser);

		System.out.println("==============Gson : Json to Map===============");
		Map<String, Object> jsonToMap = JsonUtil.jsonToMap(beanToJson, Object.class);
		System.out.println(jsonToMap);

		System.out.println("==============Gson : Json to List===============");
		List<User> jsonToList = JsonUtil.jsonToList(listToJson, User.class);
		System.out.println(jsonToList);

		System.out.println("==============Gson : json转换复杂的bean===============");
		// 将json转换成复杂类型的bean,需要使用TypeToken
		// 将json转换成Set
		String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
		Set set = gson.fromJson(json, new TypeToken<Set>() {}.getType());
		System.out.println(set);
	}
}

class User {

	private String name;
	private int age;
	private String sex;

	public User() {
	}

	public User(String name, int age, String sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "User{" +
				"name='" + name + '\'' +
				", age=" + age +
				", sex='" + sex + '\'' +
				'}';
	}
}